﻿给你一棵二叉树的根节点 root ，返回树的 最大宽度 。
树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点（即，两个端点）之间的长度。
将这个二叉树视作与满二叉树结构相同，两端点间会出现一些延伸到这一层的 null 节点，这些 null 节点也计入长度。
题目数据保证答案将会在  32 位 带符号整数范围内。

输入：root = [1, 3, 2, 5, 3, null, 9]
输出：4
解释：最大宽度出现在树的第 3 层，宽度为 4 (5, 3, null, 9) 。

输入：root = [1, 3, 2, 5, null, null, 9, 6, null, 7]
输出：7
解释：最大宽度出现在树的第 4 层，宽度为 7 (6, null, null, null, null, null, 7) 。

输入：root = [1, 3, 2, 5]
输出：2
解释：最大宽度出现在树的第 2 层，宽度为 2 (3, 2) 。

提示：
	树中节点的数目范围是[1, 3000]
	- 100 <= Node.val <= 100

    /**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
    class Solution {
    public:
        int widthOfBinaryTree(TreeNode* root) {
            vector<pair<TreeNode*, unsigned int>> q; // 用数组模拟队列

            q.push_back({ root, 1 });
            unsigned int ret = 0;
            while (q.size()) {
                // 先更新这⼀层的宽度

                auto& [x1, y1] = q[0];
                auto& [x2, y2] = q.back();
                ret = max(ret, y2 - y1 + 1);
                // 让下⼀层进队

                vector<pair<TreeNode*, unsigned int>> tmp; // 让下⼀层进⼊这个队列

                for (auto& [x, y] : q) {
                    if (x->left)
                        tmp.push_back({ x->left, y * 2 });
                    if (x->right)
                        tmp.push_back({ x->right, y * 2 + 1 });
                }
                q = tmp;
            }
            return ret;
        }
};